package cn.qy.kotlin.base

/**
 * 数
 */
fun main() {
    val d = "3.1"
    val toInt = d.toIntOrNull() ?: 0
    println(toInt)

    // Double 类型格式化
    val remainingBalance = 4.56789
    println("Remaining balance: ${"%.2f".format(remainingBalance)}")

    // apply
    val mutableList = mutableListOf(1, 2, 3)
    mutableList.apply {
        add(7)
        add(6)
        add(5)
    }
    println(mutableList)

    // let 函数能使某个变量作用于其 lambda 表达式里
    val firstItemSquared = listOf(1, 2, 3).last().let {
        it * it
    }
    println(firstItemSquared)

    // run 返回的是 lambda 的结果
    fun nameIsLong(name: String) = name.length >= 20
    "Madrigal"
        .run(::nameIsLong)
        .run(::println)

    // with 函数是 run 的变体。它们的功能行为是一样的。调用 with 时需要值参作为其第一个参数传入。
    var nameTooLong = with("Polarcubis, Supreme Master of NyetHack") {
        length > 10
    }

    // also 返回接收者对象，而 let 返回 lambda 结果
    listOf(1, 2, 3).last().also {
        println(it)
    }.also {
        println(it * it)
    }.also {
        println(it * it * it)
    }

    // takeIf 函数需要判断 lambda 中提供的条件表达式（叫 predicate），给出 true 或 false 结果
    // 概念上讲，takeIf 函数类似于 if 语句，但它的优势是可以直接在对象实例上调用，避免了临时变量赋值的麻烦
    println("hello".takeIf { it.length == 3 } ?: "猫王来了")

    // takeUnless 和 takeIf 唯一的区别是：只有判断你给定的条件结果是 false 时，takeUnless 才会返回原始接收者对象
    println("hello".takeUnless { it.length == 3 } ?: "猫王来了")

}
